package Spring5.第二章.demo2_3_单例模式;

import java.io.*;

/**
 * 序列化破坏单例模式
 *
 * 序列化就是把内存中的状态转换成字节码的形式
 * 从而转换成一个IO流，可以写入其他地方（磁盘，网络）
 * 内存中的状态会永久保留下来
 *
 * 反序列化就是将已经持久化的字节码内容转换为I/0流
 * 通过工/0流的读取,进而将读取的内容转换为Java对象
 * 在转换过程中会重新创建对象new
 */
public class DestroySeriableSingleton implements Serializable {
    public final static DestroySeriableSingleton INSTANCE = new DestroySeriableSingleton();

    private DestroySeriableSingleton(){}

    public static DestroySeriableSingleton getInstance() {
        return INSTANCE;
    }

    // 由于反序列化会破坏单例模式，添加此方法即可
    private Object readReslove() {
        return INSTANCE;
    }
}

class DestroySeriableSingletonTest {
    public static void main(String[] args) {
        DestroySeriableSingleton s1 = null;
        DestroySeriableSingleton s2 = DestroySeriableSingleton.getInstance();

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("DestroySeriableSingleton.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(s2);
            oos.flush();;
            oos.close();

            FileInputStream fis = new FileInputStream("DestroySeriableSingleton.obj");
            ObjectInputStream ois = new ObjectInputStream(fis);
            s1 = (DestroySeriableSingleton) ois.readObject();
            ois.close();

            System.out.println(s1);
            System.out.println(s2);
            System.out.println(s1 == s2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}